package utils;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Component;
import org.xml.sax.SAXException;

@Component
public  class ExcelUtil extends HibernateDaoSupport{  
	private String lastContents; 
    
	/* excel 错误提示
	 * row  当前行
	 * column  当前列
	 * context  查询规则
	 * s  当前单元格的值
	 * s2   附件条件单元格的值
	 * flag   1：重复数据错误  2：未找到数据错误 3:不能为空
	 */
	public static String excelErrorMsg(Integer row ,Integer column,String context,String s,String s2,Integer flag){
		StringBuffer Str = new StringBuffer();
		Str.append("第");
		Str.append(++row);
		Str.append("行，");
		Str.append("第");
		Str.append(++column);
		Str.append("列。");
		if(flag == 1){
			//重复数据错误
			if(context.contains("product_attr a LEFT JOIN category")){
				Str.append("类别名称：‘");
				Str.append(s2);
				Str.append("’，属性名称:‘");
				Str.append(s);
				Str.append("’已存在。");
			}else{
				if(context.contains("queryRepeat,brand,name"))
				Str.append("品牌名称‘");
				Str.append(s);
				Str.append("’");
				Str.append("已存在。");
			}
		}else if(flag == 2){
			//数据为空错误
			if(context.contains("queryNameById,category,name"))
			Str.append("类别名称：‘");
			Str.append(s);
			Str.append("’");
			Str.append("未在数据库里找到，请先添加。");
		}else if(flag == 3){
			//数据为空错误
			Str.append("不能为空");
		}
		return Str.toString();
	}
	
    public  static int getMaxRowsOfSheet(Sheet sheet){
    	int rowSize =  sheet.getPhysicalNumberOfRows();
    	for(int i=rowSize;i>0;i--){
    		Row currentRow = sheet.getRow(i-1);
    		if(isNullRow(currentRow)){
    			continue;
    		}else{
    			return i;
    		}
    	}
    	return 0;
    }
    
    public static boolean isNullRow(Row row){
    	int cellSize = row.getLastCellNum();
    	for(int j=0;j<cellSize;j++){
			Cell cell= row.getCell(j);
			if (cell != null && cell.getCellType()==0 && StringUtils.isNotBlank(String.valueOf(cell.getNumericCellValue()))) {
				return false;
			}
			if (cell != null && cell.getCellType()!=0 && StringUtils.isNotBlank(cell.getStringCellValue())) {
				return false;
			}
		}
    	return true;
    }
  
    public void characters(char[] ch, int start, int length)  
            throws SAXException {  
        // 得到单元格内容的值  
        lastContents += new String(ch, start, length);  
    }
    
    
    public static void main(String[] args){
    	try {
	    	//List<String[]> list =	ExcelUtil.readExcel("d:/参会议程.xls",false,8);
			//System.out.println(list);
		} catch (Exception e) {
			e.printStackTrace();
		}
    }
    public static String getStringVal(Cell cell){
    	String string = cell.toString();
    	if(string.contains("E8")){
    		return	string = new BigDecimal(cell.getNumericCellValue()).longValue()+ "";
    	}
    		return string;
    }
    /**
     * 检查Excel 内部是否有重复的字段
     * data 数据
     * num 行，可以组合 
     */
    public static String ExcelColumRepeat(List<String[]> data,int[] num){
    	List<String> arrayList = new ArrayList();
    	String flag = null;
    	for (String[] strings : data) {
    		StringBuffer sb = new StringBuffer();
    		for (int i : num) {
    			String string = strings[i];
    			sb.append(string);
			}
    		boolean contains = Arrays.asList(arrayList).toString().contains(addSplit(sb.toString()));
    		if(contains){
    			flag = sb.toString();
    			break;
    		}
    		arrayList.add(addSplit(sb.toString()));
		}
		return flag;
    }
    
    /**
     * 检查Excel 内部是否有重复的字段
     * data 数据
     * num 行，可以组合 
     * return:返回要输出的错误信息
     */
    public static List<String> ExcelColumRepeats(List<String[]> data,int[] num){
    	List<String> errorMsg=new ArrayList<>();
    	
    	HashMap<String,List> map=new HashMap();
    	for (int i : num) {
    		List list=new ArrayList<>();//过一个加一个
    		List repeat=new ArrayList<>();//存放重复
    		map.put("list"+i, list);
    		map.put("repeat"+i, repeat);
		}
    	
    	for(int i=0;i<data.size();i++){
    		String[] strings=data.get(i);
    		for(int j:num){
    			String s=strings[j];
    			List list=map.get("list"+j);
    			List repeat=map.get("repeat"+j);
    			
    			//判断list中是否包含当前s
    			boolean contains = Arrays.asList(list).toString().contains(s);
    			if(contains){
    				errorMsg.add("第"+(i+2)+"行第"+(j+1)+"列 "+s+" 重复");
    				System.out.println("第"+(i+2)+"行，第"+(j+1)+"列 "+s+" 重复");
    				repeat.add(s);
        		}else{
        			list.add(s);
        		}
    		}
    	}
    	
    	return errorMsg;
    }
    public static String addSplit(String s){
    	StringBuffer stringBuffer = new StringBuffer();
    	stringBuffer.append("|");
    	stringBuffer.append(s);
    	stringBuffer.append("|");
		return stringBuffer.toString();
    }
}  
